<template>
  <DetailsFormBox :title="page.title" :type="route.query.type" :form="data.form" :btns="[
    {
      title: '重置',
      icon: '',
      type: '',
      hidden: !isEdit,
      click: getForm,
    },
    {
      title: route.query.xieYiShuHao ? '保存' : '仅保存',
      icon: '',
      type: 'primary',
      hidden: !isEdit,
      click: (form: any) => {
        saveBtn(form, false)
      },
    },
    {
      title: '保存并确认',
      icon: '',
      type: 'primary',
      hidden: !isEdit,
      click: (form: any) => {
        saveBtn(form, true)
      },
    },
  ]" :formInfo="[
    {
      label: '创建人员',
      value: 'createPersonName',
    },
    {
      label: '创建时间',
      value: 'createDate',
    },
  ]" :loading="data.loading" :loadingMsg="data.loadingMsg">
    <template #default="{ form }">
      <div class="p-12">
        <OrderInfo :data="data.productOrder" :produceTaskBillNo="route.query.produceTaskBillNo" />
        <CellBox title="基本信息" isTop>
          <FlexBox>
            <ElFormItemBox label="缴库单号" prop="handInBillNo">
              <ElInputBox :data="form" dataName="handInBillNo" placeholder="系统自动生成" disabled />
            </ElFormItemBox>
            <ElFormItemBox label="缴库备注" prop="handInRemark" class="wAuto">
              <ElInputBox :data="form" dataName="handInRemark" type="textarea" :disabled="!isEdit" />
            </ElFormItemBox>
          </FlexBox>
        </CellBox>
        <PackageInfo :data="form" :isEdit="isEdit" isTop @changeBtn="changeNumber" />
        <CellBox title="单据明细" isTop>
          <template #btn>
            <div class="list-r-8 flex-start-center">
              <span>下单数量：{{
                data.productOrder?.orderBaseData?.taoZhuangQuantity || 0
              }}{{ form.productUnit }}</span>
              <el-divider direction="vertical" />
              <span>生产总数：{{
                data.productOrder?.orderBaseData?.productionQuantity || 0
              }}{{ form.productUnit }}</span>
              <el-divider direction="vertical" />
              <span>原库存数：{{ data.productOrder?.stockQuantity || 0
              }}{{ form.productUnit }}</span>
              <el-divider direction="vertical" />
              <span>缴库总数：{{
                data.productOrder?.orderBaseData?.handInSumQuantity || 0
              }}{{ form.productUnit }}</span>
              <el-divider direction="vertical" />
              <span>总箱数：{{
                data.productOrder?.orderBaseData?.handInSumBoxs || 0
              }}箱</span>
              <el-divider direction="vertical" />
              <span>总公斤数：{{
                data.productOrder?.orderBaseData?.sumExpressGoodsWeight || 0
              }}Kg</span>
            </div>
          </template>
          <TableBoxMx :data="{
            disabled: !isEdit,
            tbody: form.mxDataList,
            thead: [
              {
                label: '缴库类型',
                prop: 'handInType',
                align: 'center',
                width: 120,
                formType: 'select',
                formProp: 'mxDataList',//必填
                options: options.handInTypeMx
              },
              {
                label: '产品型号',
                prop: 'productSpecificationCode',
                align: 'center',
                width: 160,
                formType: 'select',
                formProp: 'mxDataList',//必填
                options: options.model
              },
              {
                label: '实缴数量',
                prop: 'handInQuantity',
                align: 'center',
                width: 120,
                formType: 'number',
                formProp: 'mxDataList',//必填
                changeBtn: (value: any, row: any, arr: any, rowIndex: number) => {
                  row.packagingQuantity = row.handInQuantity + row.originalQuantityUsage
                  changePackageDescription(row)
                }
              },
              {
                label: '原库存使用',
                prop: 'originalQuantityUsage',
                align: 'center',
                width: 120,
                formType: 'number',
                changeBtn: (value: any, row: any, arr: any, rowIndex: number) => {
                  row.packagingQuantity = row.handInQuantity + row.originalQuantityUsage
                  changePackageDescription(row)
                }
              },
              {
                label: '包装数量',
                prop: 'packagingQuantity',
                align: 'center',
                width: 120,
                formType: 'number',
                formProp: 'mxDataList',//必填
                changeBtn: (value: any, row: any, arr: any, rowIndex: number) => {
                  row.handInQuantity = row.packagingQuantity
                  row.originalQuantityUsage = null
                  changePackageDescription(row)
                }
              },
              {
                label: '缴库箱数',
                prop: 'handInBoxs',
                align: 'center',
                width: 120,
                formType: 'number',
                formProp: 'mxDataList',//必填
              },
              {
                label: '包装描述',
                prop: 'packageDescription',
                align: 'left',
                width: 420,
                formType: 'text',
              },
              {
                label: '公斤数',
                prop: 'kilogramQuantity',
                align: 'center',
                width: 120,
                formType: 'number',
              },
              {
                label: '备注',
                prop: 'handInMxRemark',
                align: 'center',
                width: null,
                formType: 'text',
              },
            ],
            operation: [
              {
                label: '删除',
                icon: 'Delete',
              }
            ],
            add: {
              handInType: 1, // 缴库类型：0-订单缴库；1-成品缴库
              packageGuiGeNo: '', // 包装规格代码（必填）
              productSpecificationCode: '', // 订单产品型号编码
              eachWeight: null, // 每个重量
              eachBoxQuantity: null, // 每箱数量
              handInBoxs: null, // 缴库箱数
              handInQuantity: null, // 缴库数量（实际数量）
              kilogramQuantity: null, // 公斤数
              handInMxRemark: '', // 缴库明细备注
              packageDescription: '', // 包装描述
              eachBoxPackageQuantity: null, // 每包卷数
              cartonWeight: null, // 每个纸箱重量
              packagingQuantity: null, // 包装数量
              originalQuantityUsage: null // 原库存使用
            }
          }">
          </TableBoxMx>
        </CellBox>
      </div>
    </template>
  </DetailsFormBox>
</template>
<script setup lang="ts">
import { sendMsg } from '@/utils/crossTagMag.ts';
import page from '../page.ts'; // 引入逻辑
import '../pageCss.scss'; // 引入样式
import { useListComponent } from '../pageTs'; // 引入逻辑
const { dataInfo, options, getAllDownLoad } = useListComponent();
const { proxy } = getCurrentInstance() as any;
const data: any = reactive({
  loading: false,
  loadingMsg: '',
  mainPage: 1,
  form: {
    handInID: null, // 缴库单主键ID
    handInBillNo: "", // 缴库单号（唯一识别码）
    handInType: 1, // 缴库类型：1成品缴库；2半成品缴库
    saleOrderNo: "", // 销售订单号（关联单号）
    productNo: "", // 成品代码（关联成品信息表）
    customerCode: "", // 所属客户（客户代码，非必填）
    handInPerson: "", // 缴库人员
    handInRemark: "", // 缴库备注说明（非必填）
    produceTaskBillCode: "", // 生产单号
    pageEqualTags: null, // 每张等于X枚数 / 每卷等于X枚数
    packageEqualPages: null, // 每包等于X张数【平张和折页有该属性】
    boxEqualPackages: null, // 每箱等于X包数 / 每箱等于X卷数
    boxEqualTags: null, // 每箱共计X枚数
    calculationMethod: 1, // 计算方式
    mxDataList: [
      {
        handInType: 0, // 缴库类型：0-订单缴库；1-成品缴库
        packageGuiGeNo: "", // 包装规格代码（必填）
        productSpecificationCode: "", // 订单产品型号编码
        eachWeight: null, // 每个重量
        eachBoxQuantity: null, // 每箱数量
        handInBoxs: null, // 缴库箱数
        handInQuantity: null, // 缴库数量（实际数量）
        kilogramQuantity: null, // 公斤数
        handInMxRemark: "", // 缴库明细备注
        packageDescription: "", // 包装描述
        eachBoxPackageQuantity: null, // 每包卷数
        cartonWeight: null, // 每个纸箱重量
        packagingQuantity: null, // 包装数量
        originalQuantityUsage: 0 // 原库存使用
      }
    ]
  },
  productOrder: {},
});
const isEdit = ref(true)

import { getMachine } from '@/utils/optionsArr.ts';
import { packageDescription } from '@/utils/packageDescription.ts';
import { useRoute } from 'vue-router';
// 获取当前路由对象
const route = useRoute();
const changePackageDescription = (row: any, isStart: boolean = false) => {
  const _form = data.form
  if (!isStart && !_form.pageEqualTags) {
    proxy.$message('包装信息数据缺少，请先完善', 'error')
    return
  }
  const _packageDescription = packageDescription(_form, row.packagingQuantity)
  row.packageDescription = _packageDescription.text
  row.handInBoxs = _packageDescription.actualCartonCount
  row.kilogramQuantity = proxy.$count(`${row.packagingQuantity || 0}*${_form.eachWeight || 0}+${_form.cartonWeight || 0}`, 2)

}

const changeNumber = () => {
  data.form.mxDataList.forEach((el: any) => {
    changePackageDescription(el, true)
  });
}
//获取数据
const getForm = async () => {
  let _query: any = route.query
  setLoading()
  if (!!!_query.handInBillNo) {
    getOrder()
    return
  }
  proxy.$api.ProductionBusniess.GetPageProductHandInBills({
    pageIndex: 1, //当前页码
    pageSize: 1, //每页显示数据的数量
    queryDataBaseFiled: 'handInBillNo', // 关键字查询字段，空值表示查询全部
    likeWords: _query.handInBillNo, // 查询关键字，空值表示不进行过滤
    onlySelf: 0, // 是否只查自己创建的数据：0 查所有；1 只查自己
    isShowDisabled: -1, // 是否显示禁用/作废数据：-1 所有；0 未作废；1 仅作废
    orderByFiled: '', // 排序字段名称，如 createTime、updateTime 等
    orderByType: 0, // 排序方式：0 倒序；1 升序
    //差异
    handInType: 0, //缴库类型：1成品缴库；2半成品缴库，0查询全部
    handInBillState: -1, // 缴库单据状态：0待确认；1已确认；2已作废；3已完成，-1查询全部
    inStockState: -1, // 入库状态：0待入库；1已入库；2已拒绝，-1查询全部
  })
    .then((res: any) => {
      if (res?.list?.length === 1) {
        const _row: any = res.list[0]
        isEdit.value = ['1', '2'].includes(_query.type) && _row.handInBillState === 0
        proxy.$message('获取成功')
        data.form = {
          handInID: _row.handInID,
          createDate: _row.createDate,
          createPersonName: _row.createPersonName,
          handInBillNo: _row.handInBillNo,
          handInRemark: _row.handInRemark,
          mxDataList: _row.detailList,
        }
        getOrder()
      } else {
        proxy.$message('未查询到数据')
        data.loading = false
      }
    })
    .catch(() => {
      data.loading = false
    });

  //获取工单信息
  function getOrder() {
    if (!!_query.produceTaskBillNo) {
      proxy.$api.ProductionBusniess.GetProduceTaskBillDetail({
        produceTaskBillNo: _query.produceTaskBillNo
      })
        .then((res: any) => {
          data.productOrder = res
          data.form.productNo = res.baseData.productNo//产品单号
          data.form.saleOrderNo = res.baseData.saleOrderNo//销售订单号（关联单号）
          data.form.customerCode = res.orderBaseData.customerCode//非必填字段，所属客户（客户代码）
          data.form.produceTaskBillCode = _query.produceTaskBillNo//生产单号
          data.form.handInPerson = proxy.$user.userCode//非必填字段，所属客户（客户代码）
          //包装信息
          setPackage(data.form, res)
          getModel(res.baseData.saleOrderNo)
          data.loading = false
        })
        .catch(() => {
          data.loading = false
        });
    } else {
      proxy.$message('缺少生产单号', 'error')
      data.loading = false
    }
  }
  function setPackage(form: any, res: any) {
    //包装方式
    form.productCode = res.productInfo.baseData.productCode//产品样式：1平张、2卷式、3折页
    form.productStyle = res.productInfo.baseData.productStyle//产品样式：1平张、2卷式、3折页
    form.productUnit = res.productInfo.baseData.productUnit//产品单位
    form.pageEqualTags = res.productInfo.baseData.pageEqualTags//每张等于X枚数/每卷等于X枚数
    form.packageEqualPages = res.productInfo.baseData.packageEqualPages//每张等于X枚数/每卷等于X枚数
    form.calculationMethod = res.productInfo.baseData.calculationMethod//计算方式
    form.productWeight = res.productInfo.baseData.productWeight//成品重量
    form.eachBoxQuantity = res.productInfo.baseData.eachBoxQuantity//每箱标签数
    form.cartonConfigCode = res.productInfo.baseData.cartonConfigCode//纸箱规格
    form.cartonWeight = res.productInfo.baseData.cartonWeight//纸箱重量
    form.eachBoxWeight = res.productInfo.baseData.eachBoxWeight//每箱重量
    form.eachWeight = res.productInfo.baseData.eachWeight//标签重量
  }
  //获取产品规格
  function getModel(saleOrderNo: string) {
    proxy.$api.OrderBusniess.GetOrderProductSpecificationBySaleOrderCode({
      queryBy: 0,
      queryValue: saleOrderNo,
    })
      .then((res: any) => {
        options.model = res.map((el: any) => ({
          ...el,
          label: el.productSpecificationName,
          value: el.productSpecificationCode,
        }))
      })
      .catch(() => { });
  }
};
const saveBtn = (form: any, isConfirm: boolean = false) => {
  const _form: any = {
    handInID: form.handInID, // 主键ID
    handInBillNo: form.handInBillNo, // 单号
    handInType: form.handInType, // 必填字段，缴库类型：1成品缴库；2半成品缴库
    saleOrderNo: form.saleOrderNo, // 必填字段，销售订单号（关联单号）
    productNo: form.productNo, //必填字段，成品代码（关联成品信息表）
    customerCode: form.customerCode, //非必填字段，所属客户（客户代码）
    handInPerson: form.handInPerson, // 必填字段，缴库人员
    handInRemark: form.handInRemark, // 备注
    produceTaskBillCode: form.produceTaskBillCode, //生产单号
    pageEqualTags: form.pageEqualTags, //每张等于X枚数/每卷等于X枚数
    packageEqualPages: form.packageEqualPages, //每包等于X张数【平张和折页有该属性】
    boxEqualPackages: form.boxEqualPackages, //每箱等于X包数/每箱等于X卷数
    boxEqualTags: form.boxEqualTags, //每箱共计X枚数
    calculationMethod: form.calculationMethod, //计算方式
    mxDataList: form.mxDataList.map((el: any) => (
      {
        handInType: el.handInType, // 缴库类型：0-订单缴库/发货；1-成品缴库/缴库
        packageGuiGeNo: el.packageGuiGeNo, //必填字段，包装规格代码
        productSpecificationCode: el.productSpecificationCode, // 订单产品型号编码
        eachWeight: el.eachWeight, // 每个重量
        eachBoxQuantity: el.eachBoxQuantity, // 每箱数量
        handInBoxs: el.handInBoxs, // 缴库箱数
        handInQuantity: el.handInQuantity, // 缴库数量（实际数量）
        kilogramQuantity: el.kilogramQuantity, // 公斤数
        handInMxRemark: el.handInMxRemark, // 缴库明细备注
        packageDescription: el.packageDescription, // 包装描述
        eachBoxPackageQuantity: el.eachBoxPackageQuantity, // 每包卷数
        cartonWeight: el.cartonWeight, // 每个纸箱重量
        packagingQuantity: el.packagingQuantity, // 包装数量
        originalQuantityUsage: el.originalQuantityUsage, // 原库存使用
        backRemark: el.backRemark || '', // 备注
      }
    ))
  }
  _setPackage(form)
  switch (route.query.type) {
    case '1'://新建
      proxy.$api.ProductionBusniess.CreateProductHandInBill(_form)
        .then((res: any) => {
          _form.handInID = res.handInID
          _form.handInBillNo = res.handInBillNo
          if (isConfirm) {
            getAllDownLoad(_form, data, () => {
              _setState(res)
            })
          } else {
            _sun()
          }
        })
        .catch(() => { });
      break;
    case '2'://保存
      proxy.$api.ProductionBusniess.UpdateProductHandInBill(_form)
        .then((res: any) => {
          if (isConfirm) {
            _setState(_form)
          } else {
            _sun()
          }
        })
        .catch(() => { });
      break;
    default:
      break;
  }

  function _setPackage(form: any) {
    proxy.$api.OrderBusniess.UpdateProductPackage({
      productCode: form.productCode, // 产品编码（唯一识别码）
      calculationMethod: form.calculationMethod, // 计算方式
      pageEqualTags: form.pageEqualTags, // 每张等于X枚数 / 每卷等于X枚数
      packageEqualPages: form.packageEqualPages, // 每包等于X张数【平张和折页有该属性】
      eachBoxQuantity: form.eachBoxQuantity, // 包装信息-每箱数量
      cartonWeight: form.cartonWeight, // 包装信息-每个纸箱重量
      eachBoxWeight: form.eachBoxWeight, // 包装信息-每箱重量
      eachWeight: form.eachWeight, // 包装信息-每个（套）标签重量
      cartonConfigCode: form.cartonConfigCode // 包装信息-纸箱规格Code
    })
      .then((res: any) => {
      })
      .catch((e: any) => {
      });
  }
  function _sun() {
    proxy.$message('保存成功')
    sendMsg('save', true);
    // getForm()
    window.close();
  }
  function _setState(form: any) {
    proxy.$api.ProductionBusniess.SureProductHandInBill({
      handInID: form.handInID
    })
      .then((res: any) => {
        _sun()
      })
      .catch(() => { });
  }
};
const setLoading = (title: string = '正在获取数据,请稍等...') => {
  if (!data.loading) {
    data.loading = true;
    data.loadingMsg = title;
  }
};
onMounted(() => {
  getForm();
  getMachine(options, 'machine')//获取设备
});
</script>
